/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package person.general;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.el.ELContext;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.naming.NamingException;
import net.sf.jasperreports.engine.JRException;
import system.general.Exc;
import system.general.Logged;
import system.general.Message;
import system.general.Persistencia;

/**
 *
 * @author emojica
 */
@ManagedBean(name = "person_general")
@RequestScoped
public class Main extends Beans {
    //Variables de importación General

    Logged logged;
    private Persistencia persistencia = new Persistencia();
    private Message msg = new Message();
    //Variables de importación otros modulos
    //Variables del modulo
    private Find person_generalFind = new Find();
    private List<Beans> person_generalList = new ArrayList<>();
    //Variables locales
    private String sql;
    private Map<String, String> map = new LinkedHashMap<>();

    public Main() {
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        logged = (Logged) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "logged");
        load();
    }

    private void load() {
        try {
            //Verifica si hay un registro seleccionado
            if (logged.getMasterId() == 0) {
                return;
            }

            map.clear();
            map.put("id = " + logged.getMasterId(), " ");

            person_generalList.clear();
            person_generalList = person_generalFind.byMap(map);

            setDni(person_generalList.get(0).getDni());
            setNombre(person_generalList.get(0).getNombre());
            setApellido(person_generalList.get(0).getApellido());
            setAlias(person_generalList.get(0).getAlias());
            setNacimiento(person_generalList.get(0).getNacimiento());
            setIdl_sexo(person_generalList.get(0).getIdl_sexo());
            setIdl_estadoCivil(person_generalList.get(0).getIdl_estadoCivil());
            setIdl_tipoSangre(person_generalList.get(0).getIdl_tipoSangre());
            logged.setMasterName(person_generalList.get(0).getNombre() + " " + person_generalList.get(0).getApellido());
        } catch (Exc ex) {
            msg.showMsg(namePackage(), "system", ex.getIdError());
        } catch (SQLException ex) {
            msg.showErr(namePackage(), "sql", ex);
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
        }
    }

    public void insert() {
        try {

            //Verifica si el registro existe, de lo contrario lo inserta
            map.clear();
            map.put("dni = '" + getDni(), "' ");
            if (person_generalFind.byExist(map)) {
                throw new Exc("m5");
            }

            sql = "INSERT INTO public.persona_general (dni, nombre,apellido,alias, nacimiento,idl_sexo, idl_estadocivil, idl_tiposangre) "
                    + "VALUES ("
                    + "'" + getDni() + "', "
                    + "'" + getNombre() + "', "
                    + "'" + getApellido() + "', "
                    + "'" + getAlias() + "', "
                    + "'" + getNacimiento() + "', "
                    + "'" + getIdl_sexo() + "', "
                    + "'" + getIdl_estadoCivil() + "',"
                    + "'" + getIdl_tipoSangre() + "')";

            //Inserta la información del usuario
            persistencia.executeUpdate(sql);

            //Localiza el id_persona a traves de dni (llave unica)
            person_generalList = person_generalFind.byMap(map);

            //Actualiza el logged con el ID del registro recien insertado            
            logged.setMasterId(person_generalList.get(0).getId());
            logged.setMasterName(person_generalList.get(0).getNombre() + " " + person_generalList.get(0).getApellido());
            throw new Exc("m1");

        } catch (Exc ex) {
            msg.showMsg(namePackage(), "system", ex.getIdError());
        } catch (SQLException ex) {
            msg.showErr(namePackage(), "sql", ex);
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
        }
    }

    public void update() {
        try {

            //Verifica si hay registros seleccionados
            if (logged.getMasterId() == 0) {
                throw new Exc("m4");
            }

            //Verifica si el registro existe, de lo contrario lo inserta
            map.clear();
            map.put("id <> " + logged.getMasterId(), " AND ");
            map.put("dni = '" + getDni(), "' ");
            if (person_generalFind.byExist(map)) {
                throw new Exc("m5");
            }

            sql = "UPDATE public.persona_general SET "
                    + "dni = '" + getDni() + "', "
                    + "nombre='" + getNombre() + "', "
                    + "apellido='" + getApellido() + "', "
                    + "alias = '" + getAlias() + "', "
                    + "nacimiento = '" + getNacimiento() + "', "
                    + "idl_sexo ='" + getIdl_sexo() + "', "
                    + "idl_estadocivil ='" + getIdl_estadoCivil() + "', "
                    + "idl_tiposangre ='" + getIdl_tipoSangre() + "' "
                    + "WHERE id =" + logged.getMasterId();

            //Actualiza la información del registro
            persistencia.executeUpdate(sql);

            //Actualiza el logged si se modifica el usuario logeado
            if (logged.getLoggedId() == logged.getMasterId()) {
                logged.setLoggedName(getNombre() + " " + getApellido());
            }
            logged.setMasterName(getNombre() + " " + getApellido());
            throw new Exc("m2");

        } catch (Exc ex) {
            msg.showMsg(namePackage(), "system", ex.getIdError());
        } catch (SQLException ex) {
            msg.showErr(namePackage(), "sql", ex);
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
        }
    }

    public void ver_Reporte() throws Exc, SQLException, NamingException, Exception {
        try {
            person.report.General report = new person.report.General();
            report.curriculum();
        } catch (JRException ex) {
        } catch (Exception ex) {
        } finally {
            this.persistencia.dbDisconnect();
        }
    }

    public void delete() {
        try {

            //Verifica si hay registros seleccionados
            if (logged.getMasterId() == 0) {
                throw new Exc("m4");
            }

            if (logged.getMasterId() == logged.getLoggedId()) {
                throw new Exc("m21");
            }

            //Elimina el resgistro por el id_persona
            deleteById(logged.getMasterId());
            logged.setMasterName("");
            clear();

            throw new Exc("m3");

        } catch (Exc ex) {
            msg.showMsg(namePackage(), "system", ex.getIdError());
        } catch (SQLException ex) {
            msg.showErr(namePackage(), "sql", ex);
        } catch (Exception ex) {
            msg.showErr(namePackage(), "java", ex);
        } finally {
        }
    }

    public void deleteById(int id) throws Exc, SQLException, Exception {

        //Verifica si el usuario ya existe para otra persona
        sql = "DELETE FROM public.persona_general "
                + "WHERE id = " + id;

        persistencia.executeUpdate(sql);
    }

    public void clear() {
        logged.setMasterId(0);
        logged.setMasterName("");
        logged.setDetailId(0);
        logged.setMap(map);
        clearBeans();
        map.clear();
    }

    public void selectedRecordId(int recordId) {
        logged.setMasterId(recordId);
        load();
    }

    private String namePackage() {
        Package pack = this.getClass().getPackage();
        return pack.getName();
    }
}
